const express = require('express')
const app = express()

// 路径使用history模式
const history = require('connect-history-api-fallback');
app.use(history({
    htmlAcceptHeaders: ['text/html', 'application/xhtml+xml'],
    index: '/index.html',
    rewrites: [
        { from: 'index', to: '/index.html' }, // 默认入口
    ]
}));

const cookieParser = require('cookie-parser');
app.use(cookieParser())

//跨域
const cors = require('cors')
app.use(cors({
    credentials: true,
    origin: 'http://localhost:8080', // web前端服务器地址(不然设置cookie无效，前端在axios设置withCredentials: true,//跨域
}))

//解析 application/x-www-form-urlencoded
app.use(express.json())  //解析json
app.use(express.urlencoded({ extended: true }))

//表单验证错误类型
const joi = require('joi')

//导入config 得到密钥secretKey
const config = require('./config.js')

//express-jwt解析jwt
const express_jwt = require('express-jwt')

//res.send错误情况多 可以注册一个中间件挂载res的全局方法(在路由器之前)
app.use((req, res, next) => {
    res.sendErr = (err, status = 400) => {
        //如果传进来的错误是对象就取err.message 如果是字符串就直接err
        err = err instanceof Error ? err.message : err
        //响应
        res.send({ status: status, message: err })
    }
    next()
})

//这个要写在express_jwt前面
app.use(express.static("./public"))

//注意：放在sendErr下面
//注册解析中间件(api开头的不需要访问权限 req.user存放token解析出来的用户信息)
//在客户端发送时在请求头加上{Authorization:token} 
//express_jwt这样解析会自动从请求头拿取token进行解析
//错误就抛出全局错误 得到token是否过期/其他错误
app.use(express_jwt(
    { secret: config.secretKey, algorithms: ['HS256'] }).unless({ path: [/^\/api\//] }))

//静态资源(头像的获取路径 .../api/.jpg)
app.use("/api", express.static("./coverImg"))

//路由 布局
const layout_router = require('./router/layout')
app.use('/layout', layout_router)

//user(登录 添加)
const login_router = require('./router/login')
app.use('/api', login_router)

//user(用户消息)
const user_router = require('./router/user')
app.use('/user', user_router)

//角色
const role_router = require('./router/role')
app.use('/role', role_router)

//商品
const goods_handle = require("./router/goods")
app.use('/goods', goods_handle)

//订单
const order_handle = require("./router/order")
app.use("/order", order_handle)

//分类参数
const cateParams_handle = require("./router/cateParams")
app.use("/cateParams", cateParams_handle)

//权限判断
const permission_router = require("./router/permission")
app.use("/permission", permission_router)

// 统计数据
const statistic_router = require("./router/statistic")
app.use("/statistic", statistic_router)

//出错判断
app.use((err, req, res, next) => {
    // console.log(err);
    //表单验证错误(如账号密码 6-10位数 不能存在空格)
    if (err instanceof joi.ValidationError) return res.sendErr(err)
    // express——jwt解析问题
    if (err.name === 'UnauthorizedError') {
        //token过期
        // if (err.message === 'jwt expired') return res.sendErr('token expired', 401)
        //jwt解析问题 如输入的token错误
        return res.sendErr(err, 401)
    }
    //其他错误
    res.sendErr('未知错误!' + err.message)
})

app.listen('3006', () => {
    console.log('express服务器启动成功 http://127.0.0.1:3006')
})